typedef struct { u16 LCD_X_Max; u16 LCD_Y_Max; u8 DCLK_F; u8 DCLK_Rising; u8 H_PW; u8 H_DE; u16 H_Total; u8 V_PW; u8 V_DE; u16 V_Total; }LCM_ID_Def; static LCM_ID_Def ItemList[ ]= { //[LCD_X_Max],[LCD_Y_Max],[Frame Rate] ,[DCLK_Rising],[H_PW],[H_DE],[H_Total],[V_PW],[V_DE],[V_Total] 800 , 480 ,60 , 0 /*Rising*/,4 ,20 ,928 ,10 ,12 ,525 , } void SSD1963_Ini (void) { #define DCLK_Latch 0 // 0: Rising 1: Falling #define H_Sync_polarity 0 // 0: Active low 1:Active High #define V_Sync_polarity 0 // 0: Active low 1:Active High // TFT Display timing #define H_Total 800 // Horizontal total colcks #define H_DE 800 // Horizontal back porch + Horizontal Plus width #define H_PW 10 // Horizontal Plus width #define V_Total 525 // Vertical total Lines #define V_DE 13 // Vertical back porch + Vertical Plus width #define V_PW 2 // Vertical Plus width #define DCLK_F 60 // Frame refresh rate u16 i; u32 PIXEL_CLOCK; u32 OSC_FREQ=10000000; u8 MULTIPLIER_N=35; u8 DIVIDER_M=2; u32 VCO_FREQ; u32 PLL_FREQ; u32 CAL; u32 LCDC_FPR; u8 Polarity; PIXEL_CLOCK=H_Total*V_Total* DCLK_F; VCO_FREQ=(u32)(OSC_FREQ * (MULTIPLIER_N + 1)); PLL_FREQ=(u32)(VCO_FREQ / (DIVIDER_M + 1)); CAL=(u32)(((float)((float)PIXEL_CLOCK * 128) / (float)PLL_FREQ) * 8192); LCDC_FPR=(u32)(CAL - 1); Polarity= (1<<3)|(DCLK_Latch<<2)|(H_Sync_polarity<<2)|(V_Sync_polarity<<2); LCD_RS0_WR(0xe2); //Set PLL: VCO (> 250MHz) = OSC x (N + 1) LCD_RS1_WR(MULTIPLIER_N); //Multiplier N, VCO = 360MHz LCD_RS1_WR(DIVIDER_M); //Divider M, PLL = 120MHz (Standard) LCD_RS1_WR(0x54); //dummy write, no meaning. PLL = VCO / (M + 1) LCD_RS0_WR(0xe0); //Command: Set SSD1961 PLL LCD_RS1_WR(0x01); //Turn on PLL //Delay(200); // Delay for PLL stable LCD_RS0_WR(0xe0); //Command: Set SSD1961 PLL LCD_RS1_WR(0x03); //Switch the clock source to PLL LCD_RS0_WR(0x01); //Command: Soft reset SSD1963 Delay(1); // Delay for RESET LCD_RS0_WR( 0xE6); // pclk = pll freq * (setting + 1) / 0x100000 //Set LSHIFT frequency LCD_RS1_WR( (LCDC_FPR&0x000F0000)>>16); //Remark: 0x100000 must be divided by (setting+1), otherwise, pclk may oscilate LCD_RS1_WR( (LCDC_FPR&0x0000FF00)>>8); //pclk = 5MHz LCD_RS1_WR( (LCDC_FPR&0x000000FF)); //refresh rate = 5MHz / (336 * 244) = 60.98Hz LCD_RS0_WR( 0xb0); // display period //Set LCD mode / pad strength LCD_RS1_WR( Polarity); // [B5:0] - 18Bit [B2:1] LSHIFT data latch falling edge [B1:0] LLINE active low [B0:0] - LFRAME active low LCD_RS1_WR( 0x00); LCD_RS1_WR( ((LCD_X_Max-1)&0xFF00)>>8); //0x13F = 320 - 1 (Horizontal) LCD_RS1_WR( (LCD_X_Max-1)&0x00FF); LCD_RS1_WR( ((LCD_Y_Max-1)&0xFF00)>>8); //0x0ef = 240 - 1 (Vertical) LCD_RS1_WR( (LCD_Y_Max-1)&0x00FF); LCD_RS0_WR( 0xb4); // hsync LCD_RS1_WR( ((H_Total-1)&0xFF00)>>8); // ht LCD_TOTAL_WIDTH - 1 LCD_RS1_WR( (H_Total-1)&0x00FF); LCD_RS1_WR( (H_DE&0x0700)>>8); LCD_RS1_WR( (H_DE)&0x00FF); // Horizontal Start 8 pclks LCD_RS1_WR( H_PW - 1); // pulse width = setting + 1 clock = 2 clock LCD_RS1_WR( 0x00); LCD_RS1_WR( 0x00); LCD_RS0_WR( 0xb6); // vsync LCD_RS1_WR( ((V_Total-1)&0xFF00)>>8); // vt 244-1 LCD_RS1_WR( (V_Total-1)&0x00FF); LCD_RS1_WR( (V_DE&0x0700)>>8); LCD_RS1_WR( (V_DE)&0x00FF); // Vertical Start Position: 2 line LCD_RS1_WR( V_PW - 1); // pulse width = setting + 1 line = 2 line LCD_RS1_WR( 0x00); LCD_RS1_WR( 0x00); LCD_RS0_WR( 0x29); // display on //Delay(200); LCD_RS0_WR( 0xb8); // config gpio LCD_RS1_WR( 0x0f); LCD_RS1_WR( 0x01); LCD_RS0_WR( 0xb9); // config gpio LCD_RS1_WR( 0x0f); LCD_RS1_WR( 0x01); LCD_RS0_WR( 0xba); // Set GPIO LCD_RS1_WR( 0x06); //Set X Address LCD_RS0_WR( 0x2a); LCD_RS1_WR( 0x00); LCD_RS1_WR( 0x00); LCD_RS1_WR( ((LCD_X_Max-1) & 0xFF00)>>8); LCD_RS1_WR( ((LCD_X_Max-1) & 0x00FF)); //Set Y Address LCD_RS0_WR( 0x2b); LCD_RS1_WR( 0x00); LCD_RS1_WR( 0x00); LCD_RS1_WR( ((LCD_Y_Max-1) & 0xFF00)>>8); LCD_RS1_WR( ((LCD_Y_Max-1) & 0x00FF)); //Set the read order from frame buffer to the display panel LCD_RS0_WR( 0x36); LCD_RS1_WR( 0x00); /* //Set the pwm configuration LCD_RS0_WR( 0xBE); LCD_RS1_WR( 0x08); //Set the PWM frequency in system clock 00h = Fastest FFh = Slowest LCD_RS1_WR( 0xFF); //Set the PWM duty cycle 00h = Always low FFh = Always high LCD_RS1_WR( 0x01); */ LCD_RS0_WR( 0xbe);//pwm config LCD_RS1_WR( 0x01); LCD_RS1_WR( 0xff); LCD_RS1_WR( 0x09);//dbc control pwm LCD_RS1_WR( 0xFF);//D[7:0] : DBC manual brightness (00 Dimmest FF brightest) LCD_RS1_WR( 0x00);//D[7:0] : DBC minimum brightnesss (00 Dimmest FF brightest) LCD_RS1_WR( 0x0F);// F[3:0] : Brightness prescaler (0 Dimmest F brightest) LCD_RS0_WR( 0xd4);//set threshold; LCD_RS1_WR( 0x00); LCD_RS1_WR( 0x16); LCD_RS1_WR( 0x80); LCD_RS1_WR( 0x00); LCD_RS1_WR( 0x38); LCD_RS1_WR( 0x40); LCD_RS1_WR( 0x00); LCD_RS1_WR( 0x87); LCD_RS1_WR( 0x00); LCD_RS0_WR( 0xd0);//enable dbc LCD_RS1_WR( 0<<6 | 0<<5 | 1<<2 | 1<<0); // A[6] : ABC bypass 0: ABC is not bypassed 1 ABC is bypassed // A[5] : Transition effect // 0 Transition effect disable 1 Transition effect enable // A[3:2] : Energy saving selection for DBC (POR = 00) // 00 DBC is disable 01 Conservative mode 10 Normal mode 11 Aggressive mode // A[0] : Master enable of ABC and DBC // 0 DBC/ABC is not enabled 1 DBC/ABC is enabled // Set LCD_RS0_WR( 0xf0); LCD_RS1_WR( 0x03); /* LCD_RS0_WR( 0x30); //set_partial_area LCD_RS1_WR( 000); LCD_RS1_WR( 100); LCD_RS1_WR( 000); LCD_RS1_WR( 200); LCD_RS0_WR( 0x12); //enter_partial_mode */ } void SSD1963_WindowSet(u16 S_X,u16 S_Y,u16 E_X,u16 E_Y) { LCD_RS0_WR( 0x2a); LCD_RS1_WR( (u8)((S_X>>8)) ); LCD_RS1_WR( (u8)(S_X ) ); LCD_RS1_WR( (u8)((E_X-1)>>8) ); LCD_RS1_WR( (u8)(E_X-1) ); //Set Y Address LCD_RS0_WR( 0x2b); LCD_RS1_WR( (u8)((S_Y>>8)) ); LCD_RS1_WR( (u8)(S_Y ) ); LCD_RS1_WR( (u8)((E_Y-1)>>8) ); LCD_RS1_WR( (u8)(E_Y-1) ); } void SSD1963_RAM_W_Enable(void) { //Display RAM Write Enable LCD_RS0_WR( 0x2C); LCD_RS0_WR( 0x3C); } void SSD1963_PutPixel(u16 x ,u16 y , u16 color) { SSD1963_WindowSet(x,y,x,y); SSD1963_RAM_W_Enable(); LCD_RS1_WR(color); } /**************************************************************************** * 名 稱:SSD1963_GUI_R_Full() * 功 能:填充矩形。畫一個填充的矩形,填充色與邊框色一樣。 * 入口參數:x0 矩形左上角的x坐標值 * y0 矩形左上角的y坐標值 * x1 矩形右下角的x坐標值 * y1 矩形右下角的y坐標值 * color 填充顏色 * 出口參數:無 * 說 明:操作失敗原因是指定地址超出有效範圍。 ****************************************************************************/ void SSD1963_LCM_RetangeFull(u16 x0,u16 y0,u16 x1,u16 y1,u16 color) { u16 k,l; SSD1963_WindowSet(x0,y0,x1,y1); SSD1963_RAM_W_Enable(); //Display RAM Write Enable for(k=y0;k